const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
const User = require("../models/user");
const Admin = require("../models/admin");

// 注册用户
exports.registerUser = async (req, res) => {
  try {
    const { username, email, password } = req.body;
    const existingUser = await User.findByEmail(email);
    if (existingUser) {
      return res.status(400).json({ error: "该邮箱已被注册" });
    }
    const hashedPassword = await bcrypt.hash(password, 8);
    const userId = await User.create({
      username,
      email,
      password: hashedPassword
    });
    res.status(201).json({ message: "注册成功", userId });
  } catch (error) {
    console.error("注册失败:", error);
    res.status(500).json({ error: "内部服务错误" });
  }
};

// 注册管理员
exports.registerAdmin = async (req, res) => {
  try {
    const { username, email, password, is_super_admin } = req.body;
    const existingAdmin = await Admin.findByEmail(email);
    if (existingAdmin) {
      return res.status(400).json({ error: "该邮箱已被注册" });
    }
    const hashedPassword = await bcrypt.hash(password, 8);
    const adminId = await Admin.create({
      username,
      email,
      password: hashedPassword,
      is_super_admin,
    });
    res.status(201).json({ message: "管理员注册成功", adminId });
  } catch (error) {
    console.error("注册失败:", error);
    res.status(500).json({ error: "内部服务错误" });
  }
};

// 用户登录
exports.loginUser = async (req, res) => {
  try {
    const { email, password } = req.body;
    const user = await User.findByEmail(email);
    if (!user || !(await bcrypt.compare(password, user.password))) {
      return res.status(401).json({ error: '用户凭据无效' });
    }
    const token = jwt.sign({ id: user.id, isAdmin: 0 }, process.env.JWT_SECRET, { expiresIn: '12h' }); // isAdmin 0 表示普通用户
    
    // 创建包含用户信息的 JSON 字符串
    const userInfo = {
      userId: user.id,
      username: user.username,
      isAdmin: 0,
      isSuperAdmin: 0
    };
    
    res.json({ token, user: userInfo });
  } catch (error) {
    res.status(500).json({ error: '内部服务错误' });
  }
};

// 管理员登录
exports.loginAdmin = async (req, res) => {
  try {
    const { email, password } = req.body;
    const admin = await Admin.findByEmail(email);
    if (!admin || !(await bcrypt.compare(password, admin.password))) {
      return res.status(401).json({ error: '管理员凭据无效' });
    }
    let isAdmin = 1; // 管理员
    let isSuperAdmin = admin.is_super_admin === 1 ? 1 : 0; // 是否超级管理员
    const token = jwt.sign(
      { id: admin.id, isAdmin, isSuperAdmin },
      process.env.JWT_SECRET,
      { expiresIn: '12h' }
    );
    
    // 创建包含管理员信息的 JSON 字符串
    const userInfo = {
      userId: admin.id,
      username: admin.username,
      isAdmin: isAdmin,
      isSuperAdmin: isSuperAdmin
    };
    
    res.json({ token, user: userInfo });
  } catch (error) {
    res.status(500).json({ error: '内部服务错误' });
  }
};

exports.changePassword = async (req, res) => {
  try {
    const { user_id, username, email, password } = req.body;
    const { id: tokenId, isAdmin } = req.user;
    // 身份验证（包含管理员类型判断）
    if (parseInt(user_id) !== parseInt(tokenId)) {
      return res.status(403).json({ error: "修改失败，请联系管理员！" });
    }
    // 根据用户类型选择操作模型
    const currentModel = isAdmin === 1 ? Admin : User;
    const roleName = isAdmin === 1 ? "管理员" : "用户";
    // 验证账户存在性
    const account = await currentModel.findById(user_id);
    if (!account) {
      return res.status(404).json({ error: `${roleName}不存在` });
    }
    // 执行账号更新
    const hashedPassword = await bcrypt.hash(password, 8);
    const updateSuccess = await currentModel.update(user_id, {
      username: username,
      email: email,
      password: hashedPassword
    });
    if (!updateSuccess) {
      return res.status(500).json({ error: "修改失败" });
    }
    res.json({ code: 200,message: "修改成功" });
  } catch (error) {
    console.error("密码修改失败:", error);
    res.status(500).json({ error: "内部服务错误" });
  }
};
